#include <iostream>

// 仿函数：让类的对象像函数一样可以被调用（调用：函数名+() -> 类名+()）
// 所以要重载()

#if 0
    int add(int a, int b)
    {
        return a + b;
    }

    int minus(int a, int b)
    {
        return a - b;
    }

    // 用函数指针做个回调
    void func(int (*ptr)(int, int), int a, int b)
    {
        std::cout << ptr(a, b) << std::endl;
    }

    int main()
    {
        func(add, 1, 2);
        func(minus, 1, 2);
        return 0;
    }
#endif

#if 1
    class Func
    {
    public:
        Func(int c):c(c){}
        int operator()(int a, int b)
        {
            return a + b + c;
        }
    
    private:
        int c;
    };

    int add(int a, int b)
    {
        return a + b;
    }

    int minus(int a, int b)
    {
        return a - b;
    }

    // 用类的对象替换函数指针
    // 函数指针说到底只是一个指针，而类的对象可以包含非常多的东西（函数、成员变量），这些东西都可以使用
    // 所以类的对象比函数指针灵活太多了
    void func(Func &f, int a, int b)
    {
        std::cout << f(a, b) << std::endl;
    }

    int main()
    {
        Func f(3);
        std::cout << f(1, 2) << std::endl;
        return 0;
    }
#endif